home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 41 / Amiga Format CD41 (1999-06)(Future Publishing)(GB)[!][issue 1999-07].iso / -seriously_amiga- / cd-rom / acdb / src / acdb_files.e < prev    next >
Text File  |  1999-04-28  |  10KB  |  397 lines

  1. OPT MODULE,OSVERSION=37
  2. OPT PREPROCESS,REG=5
  3.  
  4.  
  5. /*
  6.  *-- AutoRev header do NOT edit!!
  7.  *
  8.  *   Project         :   AMIGA CD BASE - program obsîugujâcy CDDB
  9.  *   File            :   acdb_files.e
  10.  *   Description     :   obsîuga plików z identyfikatorami CDID
  11.  *   Copyright       :   ©1999, Piotr Gapiïski
  12.  *   Author          :   Piotr Gapiïski
  13.  *   Creation Date   :   19.04.99
  14.  *   Current version :   1.1
  15.  *   Translator      :   AmigaE v3.3a
  16.  *
  17.  *-- REVISION HISTORY
  18.  *
  19.  *   1.1 (19.04.99)
  20.  *    o   gdy CLEANTEMP=no to pliki z TEMP dla których ôciâgniëto opis dostajâ rozszerzenie .ok
  21.  *    o   po zakoïczeniu pobierania opisów (bez wzglëdu na to czy zakoïczyîo sië to powodzeniem
  22.  *        czy teû nie) wyôwietlane jest podsumowanie
  23.  *    o   progress inficator dziaîa takûe gdy ôciâganie opisu odbywa sië via DOWNLOAD IDFILE
  24.  *
  25.  *   1.0 (09.03.99)
  26.  *    o   skaner reaguje TYLKO na pliki w formacie IDxxxxxxxx (wszelkie mutacje typu
  27.  *        pliki majâce w nazwie kropkë lub nie rozpoczynajâce sië literami ID bëdâ pomijane)
  28.  *
  29.  *-- REV_END --*
  30.  */
  31.  
  32. MODULE 'exec/lists','dos/dos','dos/dosextens','exec/nodes','utility/hooks',
  33.        'dos/exall','dos/datetime','tools/inithook','amigalib/lists',
  34.        'easygui/plugins/simplegauge'
  35. MODULE '*acdb_debug','*acdb_gui','*acdb_cd','*acdb_net','*acdb_arexx'
  36. MODULE '*acdb_cddb'
  37.  
  38.  
  39.   #ifdef DEBUG
  40.     MODULE 'tools/debug'
  41.     #define D(a,b) kputfmt(a,b)
  42.   #endif
  43.   #ifndef DEBUG
  44.     #define D(a,b)
  45.   #endif
  46.  
  47.   CONST BUFFERSIZE      = 2048,
  48.         PARSESIZE       = 208
  49.  
  50.   EXPORT DEF tt_temp, tt_disks, tt_delete
  51.   EXPORT DEF gad_writeid, gad_download, gad_progress:PTR TO simplegauge_plugin, gad_abort
  52.  
  53.  
  54.  
  55. EXPORT PROC fleWrite(force=FALSE, arexx=NIL:PTR TO arxArgs) HANDLE
  56.  
  57.   ->-
  58.   ->- procedura zapisujâca opis pîyty kompaktowej na dysk do pliku o nazwie
  59.   ->- zgodej z CDID
  60.   ->- jako pierwsze nastëpuje sprawdzenie czy opis do danej pîytki juû jest
  61.   ->- ôciâgniëty z internetu (jest w disks) czy nie
  62.   ->- zwraca 0 w przypadku powodzenia lub wskaúnik do opisu bîëdu
  63.   ->-
  64.  
  65.   DEF cd, filename, handle=NIL
  66.   DEF path[255]:STRING
  67.  
  68.  
  69.   guiGadgetAble(gad_download, TRUE)
  70.   guiGadgetAble(gad_abort, TRUE)
  71.   IF (cd := cdCreateInfo())=NIL THEN Raise('CD-ROM is empty! Please\ninsert disc and try again')
  72.   filename := cdFileId(cd)
  73.  
  74.   IF (force = FALSE)
  75.  
  76.     ->-
  77.     ->- sprawdzenie czy pîytka ma juû opis (w katalogu DISKS)
  78.     ->-
  79.  
  80.     StrCopy(path, tt_disks)
  81.     AddPart(path, filename, 255)
  82.     IF FileLength(path)<>(-1)
  83.  
  84.       ->-
  85.       ->- plik juû istnieje
  86.       ->-
  87.  
  88.       IF guiInformUser('Description file for this CD\n already exists! Save anyway?', '_Ok|_Cancel')=FALSE THEN Raise()
  89.     ENDIF
  90.   ENDIF
  91.  
  92.   ->-
  93.   ->- zapisywanie do katalogu TEMP
  94.   ->-
  95.  
  96.   StrCopy(path, tt_temp)
  97.   AddPart(path, filename, 255)
  98.   IF (handle := Open(path, MODE_NEWFILE))
  99.  
  100.     ->-
  101.     ->- zapis danych do pliku o nazwie FILEID
  102.     ->-
  103.  
  104.     cdWriteInfo(cd, handle)
  105.     D('[FLEWRITE] write to file \s\n', [path, NIL])
  106.     Close(handle)
  107.   ELSE
  108.     Raise('Write error!\nCannot write to the TEMP directory!')
  109.   ENDIF
  110.  
  111. EXCEPT DO
  112.   guiGadgetAble(gad_download, FALSE)
  113.   IF (cd) THEN cdFreeInfo(cd)
  114.   IF (exception)
  115.     D('[FLEWRITE] error \s\n', [exception, NIL])
  116.  
  117.     IF (arexx)
  118.  
  119.       ->-
  120.       ->- procedura zostaîa wywoîana z poziomu arexx'a wiëc wszelkie komunikaty
  121.       ->- o bîëdach wîaônie tam bëdâ przekazane
  122.       ->-
  123.  
  124.       arexx.err := exception
  125.       arexx.rclong := 0
  126.     ELSE
  127.  
  128.       ->-
  129.       ->- domyôlnie bëdzie wyôwietlony requester
  130.       ->-
  131.  
  132.       DisplayBeep(NIL)
  133.       guiInformUser(exception, NIL, exceptioninfo)
  134.     ENDIF
  135.   ENDIF
  136. ENDPROC (exception = NIL)
  137.  
  138.  
  139.  
  140. EXPORT PROC fleDownload(filecd=NIL, arexx=NIL:PTR TO arxArgs) HANDLE
  141.  
  142.   ->-
  143.   ->- procedura przetwarzajâca dane zebrane w katalogu TEMP
  144.   ->- dla kaûdego pliku îâczy sië z CDDB i pobiera wszystkie opisy
  145.   ->-
  146.  
  147.   DEF setup_net=FALSE, files:lh, cd, rc=FALSE, i=0, bad=0, max
  148.   DEF tmp[255]:STRING
  149.  
  150.  
  151.   newList(files)
  152.   IF (setup_net := netSetup())=FALSE THEN Raise('Can not open bsdsocket.library!\nPlease make sure that\nTCP/IP stack is running')
  153.   D('[DOWNLOAD] flip gadgets\n', NIL)
  154.   guiGadgetAble(gad_writeid, TRUE)
  155.   guiGadgetAble(gad_download, TRUE)
  156.   guiGadgetAble(gad_abort, FALSE)
  157.  
  158.   IF (filecd)
  159.  
  160.     ->-
  161.     ->- download tylko tego jednego pliku
  162.     ->- okreôlonego przez strukturë cdinfo
  163.     ->-
  164.  
  165.     AddHead(files, filecd)
  166.   ELSE
  167.  
  168.     ->-
  169.     ->- downloading wszystkich opisów z katalogu TEMP
  170.     ->-
  171.  
  172.     D('[DOWNLOAD] scan TEMP directory\n', NIL)
  173.     gad_progress.set(PLA_SimpleGauge_Current, i)
  174.     IF scanfiles(files, tt_temp)=FALSE THEN Raise('Can not scan TEMP directory!\nProbably wrong or missing TOOLTYPE')
  175.     IF IsListEmpty(files) THEN  Raise('TEMP directory is EMPTY!\nFirst you must create some cdid files')
  176.   ENDIF
  177.  
  178.   max := countfiles(files)
  179.   gad_progress.set(PLA_SimpleGauge_Max, max)
  180.  
  181.   WHILE (cd := RemHead(files))
  182.     gad_progress.set(PLA_SimpleGauge_Current, i++)
  183.  
  184.     D('[DOWNLOAD] file \s\n', [cdFileId(cd), NIL])
  185.     IF (rc := cddb(cd, arexx))
  186.  
  187.       D('[DOWNLOAD] complete\n', NIL)
  188.  
  189.       IF (tt_delete)
  190.  
  191.         ->-
  192.         ->- skasuj niepotrzebny (juû) identyfikator pîyty w katalogu TMP
  193.         ->-
  194.  
  195.         StrCopy(tmp, tt_temp)
  196.         AddPart(tmp, cdFileId(cd), 255)
  197.         DeleteFile(tmp)
  198.         D('[DOWNLOAD] delete cdid file \s\n', [tmp, NIL])
  199.       ELSE
  200.  
  201.         ->-
  202.         ->- zmieï nazwe pliku w katalogu TEMP
  203.         ->-
  204.  
  205.         renametemp(cd, '.ok')
  206.         D('[DOWNLOAD] mark cdid file \s as OK!\n', [tmp, NIL])
  207.       ENDIF
  208.     ELSE
  209.  
  210.       ->-
  211.       ->- licznik niepowodzeï przy ôciâganiu opisów
  212.       ->-
  213.  
  214.       bad++
  215.     ENDIF
  216.  
  217.     cdFreeInfo(cd)
  218.     IF (rc = FALSE) THEN Raise()
  219.     gad_progress.set(PLA_SimpleGauge_Current, i)
  220.   ENDWHILE
  221.  
  222.   ->-
  223.   ->- zakoïczone pomyôlnie
  224.   ->-
  225.  
  226.   rc := TRUE
  227.  
  228. EXCEPT DO
  229.   IF (exception)
  230.     D('[DOWNLOAD] error \s\n', [exception, NIL])
  231.  
  232.     IF (arexx)
  233.  
  234.       ->-
  235.       ->- procedura zostaîa wywoîana z poziomu arexx'a wiëc wszelkie komunikaty
  236.       ->- o bîëdach wîaônie tam bëdâ przekazane
  237.       ->-
  238.  
  239.       arexx.err := exception
  240.       arexx.rclong := 0
  241.     ELSE
  242.  
  243.       ->-
  244.       ->- domyôlnie bëdzie wyôwietlony requester
  245.       ->-
  246.  
  247.       DisplayBeep(NIL)
  248.       guiInformUser(exception, NIL, exceptioninfo)
  249.     ENDIF
  250.   ELSE
  251.  
  252.     ->-
  253.     ->- jeûeli downloading zakoïczyî sië (ogólnie) pomyôlnie to
  254.     ->- wyôwietl podsumowanie (o ile nie jest w trybie Arexx'a)
  255.     ->-
  256.  
  257.     IF (arexx = NIL)AND(rc) THEN guiInformUser('Progress Report\n%ld file(s) in TEMP directory\n%ld file(s) processed\n%ld file(s) downloaded', NIL, [max, i, (i - bad), NIL])
  258.   ENDIF
  259.  
  260.   guiGadgetAble(gad_writeid, FALSE)
  261.   guiGadgetAble(gad_download, FALSE)
  262.   guiGadgetAble(gad_abort, TRUE)
  263.   IF (setup_net) THEN netCleanUp()
  264.   freeallfiles(files)
  265. ENDPROC rc
  266.  
  267.  
  268.  
  269.     ->-
  270.     ->- prywatne
  271.     ->- procedury wspomagajâce obsîugë plików
  272.     ->-
  273.  
  274.  
  275.  
  276. PROC scanfiles(files:PTR TO lh, dir:PTR TO CHAR)
  277.  
  278.   ->-
  279.   ->- procedura skanujâca ûâdany katalog i doîâczajâca wyszukane pliki jako
  280.   ->- struktury cdinfo do listy
  281.   ->- skanowanie jest selektywne - z filtrem ID~(#?.#?) przepuszczajâcym tylko pliki
  282.   ->- zaczynajâce sië od ID i nie zawierajâce w nazwie kropki
  283.   ->-
  284.  
  285.   DEF fl, eac:PTR TO exallcontrol, ed:PTR TO exalldata, p:PTR TO exalldata
  286.   DEF more=DOSTRUE, res2, rc=FALSE, n, cd
  287.   DEF hook:hook, path[255]:STRING, parseBuffer:PTR TO CHAR
  288.   DEF handle=NIL
  289.  
  290.   IF IsListEmpty(files)=FALSE THEN freeallfiles(files)
  291.   IF (fl := Lock(dir, SHARED_LOCK))
  292.     IF (eac := AllocDosObject(DOS_EXALLCONTROL, NIL))
  293.       IF (ed := New(BUFFERSIZE))
  294.  
  295.         IF (parseBuffer := New(PARSESIZE)) THEN ParsePatternNoCase('ID~(#?.#?)', parseBuffer, PARSESIZE)
  296.  
  297.         ->-
  298.         ->- hook identyfikacji odczytywanych pozycji
  299.         ->-
  300.  
  301.         inithook(hook, {matchFunc})
  302.         eac.matchfunc := hook
  303.  
  304.         ->-
  305.         ->- inicjalizacja struktury exallcontrol, pattern parsing jest zawsze aktywny!
  306.         ->-
  307.  
  308.         eac.lastkey     := 0
  309.         eac.matchstring := IF (parseBuffer) THEN parseBuffer ELSE NIL
  310.  
  311.         ->-
  312.         ->- odczytaj WSZYSTKIE elementy katalogu
  313.         ->-
  314.  
  315.         WHILE (more <> DOSFALSE)
  316.           more := ExAll(fl, ed, BUFFERSIZE, ED_SIZE, eac)
  317.           res2 := IoErr()
  318.  
  319.           ->-
  320.           ->- obróbka odczytanej pozycji katalogu (otwieranie sterowników kart)
  321.           ->-
  322.  
  323.           p := ed; n := eac.entries
  324.           WHILE (n)
  325.  
  326.             ->-
  327.             ->- dla kaûdego pliku konstruuj peînâ ôcieûkë dostëpu i odczytuj zawartoôê
  328.             ->-
  329.  
  330.             StrCopy(path, dir)
  331.             AddPart(path, p.name, 255)
  332.             IF (handle := Open(path, MODE_OLDFILE))
  333.               cd := cdRawInfo()
  334.               IF (cd) THEN IF cdReadInfo(cd, handle) THEN AddHead(files, cd)
  335.               Close(handle)
  336.             ENDIF
  337.             p := p.next
  338.             n--
  339.           ENDWHILE
  340.  
  341.           ->-
  342.           ->- zaznacz, ûe wszystkie elementy zostaîy odczytane
  343.           ->-
  344.  
  345.           IF (more = DOSFALSE)AND(res2 = ERROR_NO_MORE_ENTRIES) THEN rc := TRUE
  346.         ENDWHILE
  347.         Dispose(ed)
  348.         Dispose(parseBuffer)
  349.       ENDIF
  350.       FreeDosObject(DOS_EXALLCONTROL, eac)
  351.     ENDIF
  352.     UnLock(fl)
  353.   ENDIF
  354. ENDPROC rc
  355.  
  356.  
  357.  
  358. PROC matchFunc(hook:PTR TO hook,p,ed:PTR TO exalldata)
  359.  
  360.   ->-
  361.   ->- funkcja zapewniajâca pomijanie wszelkich linków w liôcie plików
  362.   ->- zwraca TRUE/FALSE (TRUE gdy plik nadaje sië do doîâczenia do listy)
  363.   ->-
  364.  
  365.   VOID p
  366.   VOID hook
  367. ENDPROC (ed.type < 0)
  368.  
  369.  
  370.  
  371. PROC freeallfiles(files:PTR TO lh)
  372.  
  373.   ->-
  374.   ->- zwalnia pamiëc zajëtâ przez listë plików
  375.   ->- nie zwraca ûadnej wartoôci
  376.   ->-
  377.  
  378.   DEF cd
  379.  
  380.   IF (files = NIL) THEN RETURN
  381.   WHILE (cd := RemHead(files)) DO cdFreeInfo(cd)
  382. ENDPROC
  383.  
  384.  
  385.  
  386. PROC countfiles(files:PTR TO lh)
  387.  
  388.   DEF head:PTR TO ln,i=0
  389.  
  390.  
  391.   head := files.head
  392.   WHILE head.succ
  393.     head := head.succ
  394.     INC i
  395.   ENDWHILE
  396. ENDPROC i
  397.